use std::marker::PhantomData; //虚类型参数的类型
// 这个虚元组结构体对`A`是泛型的，并且带有隐藏参数`B`
// 允许这种类型进行相等测试
#[derive(PartialEq)]
struct PhantomTuple<A, B>(A, PhantomData<B>);
// 这个虚元组结构体对`A`是泛型的，并且带有隐藏参数`B`
// 允许这种类型进行相等测试
#[derive(PartialEq)]
struct PhantomStruct<A, B>{ first: A, phantom: PhantomData<B> }
// 注意：对于泛型`A`会分配存储空间,但是对于`B`不会分配存储空间
// 因此不`B`不能参与运算
fn main() {
//     这里`f32`和`f64`是隐藏参数
//     被指定为`<char, f32>`的`PhantomTuple`类型
    let _t1: PhantomTuple<char, f32> = PhantomTuple('a', PhantomData);
//     被指定为`<char, f64>`的`PhantomTuple`类型
    let _t2: PhantomTuple<char, f64> = PhantomTuple('a', PhantomData);
    //     被指定为`<char, f32>`的`PhantomStruct`类型
    let _s1: PhantomStruct<char, f32> = PhantomStruct { first: 'a', phantom: PhantomData };
    //     被指定为`<char, f64>`的`PhantomStruct`类型
    let _s2: PhantomStruct<char, f64> = PhantomStruct { first: 'a', phantom: PhantomData };

//     编译期错误：无法比较`PhantomTuple`类型
//     println!("{}", _t1 == _t2);
//     编译期错误：无法比较`PhantomStruct`类型
//     println!("{}", _s1 == _s2);
}
